home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / text / hyper / ScionToMosaic.lha / ScionToMosaic.rexx
Encoding:
OS/2 REXX Batch file  |  1995-02-27  |  54.6 KB  |  1,574 lines

  1. /* © Harold H. Ipolyi        11 June 1994
  2.  
  3.         Requires ScionGenealogist V 3.13+
  4.  
  5. -------------------------------README----------------------------------------
  6. Short: make Mosaic html's from Scion genealogy database
  7.  
  8. Type: util/rexx
  9.  
  10. Uploader: ipolyi@pat.mdc.com
  11.  
  12. Author: Harold H. Ipolyi, P.O.Box 891206, Houston, Tx 77289-1206
  13.  
  14.             Release History:
  15.  
  16.        11 Jun 1994 . ScionGenealogist V 3.06
  17. Rev01: 19 Jun 1994 . MakeDir(Gdir) fixed; extra comments processed.
  18. Rev02: 25 Jun 1994 . Fixed descenders; Women in List italicised
  19.                    . ScionGenealogist V 3.13
  20. Rev03:  3 Sep 1994 . Replace occurrences of "<ScionIRN>" by Data Base NAMES
  21.                    . e.g. Replace any <101> by Iam Onehundredone, Jr.
  22.                    . Added Family Info file processing; Ancestor trees
  23.                    . Added descendant charts
  24.                    . Women italicised; men boldface everywhere
  25.                    . Added creation of a textual file "GenealogyOf..."
  26. Rev04:  1 Mar 1995 . cleaned up bugs in creation of a textual file
  27.  
  28.  
  29. an ARexx script to make Mosaic hypertext from ScionGenealogist data base
  30.  
  31.  
  32.  WHY?    some others in my family don't have Amigas.
  33.  
  34.     ScionGenealogist is easy to use, comprehensive, and
  35.     provides Arexx ports for extracting data.
  36.  
  37.     An ARexx script can repeatedly and painlessly recreate Mosaic
  38.     .html files from entries in the ScionGenealogist data base.
  39.  
  40.     Mosaic is an available common method of presentation.
  41.  
  42.  
  43.  TESTED:    on Amiga3000 Kickstart v.37.175 Workbench v.38.35
  44.         &  Amiga3000 Kickstart v.40.68  Workbench v.40.42
  45.         w/ ScionGenealogist V 3.06 & Mosaic1.2beta_NoNet
  46.         w/ ScionGenealogist V 3.13 & Mosaic1.2_NoNet
  47.  
  48.         Mosaic .html file compatibility tested on Sun NCSA Mosaic
  49.  
  50. -------------------------------README----------------------------------------
  51.   -----------------------------------------------------------------
  52.  | This Script is somewhat dependent on the following conventions  |
  53.  | that I followed in my ScionGenealogist data base:               |
  54.  |                                                                 |
  55.  | ·  lastnames are kept pure (no honorifics, Jr's, III's )        |
  56.  |                                                                 |
  57.  | ·  given names have any and all honorifics AFTER a COMMA        |
  58.  |                                                                 |
  59.  |  for example:  LastName      FirstNames, honorifics             |
  60.  |                                                                 |
  61.  |                BAUER-GAUSS   Joseph, Dr.                        |
  62.  |                DAGLEY        Richard Kelley, Jr.                |
  63.  |                                                                 |
  64.  |-----------------------------------------------------------------|
  65.  |                                                                 |
  66.  |  For a name change (NOT maidenname > marriedname), try this:    |
  67.  |                New           Birth Name > Changed To, Ph. D.    |
  68.  |     which lists as: Birth Name > Changed To New, Ph. D.         |
  69.  |                                                                 |
  70.   -----------------------------------------------------------------
  71. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  72. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  73. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  74. »«»«                                                                »«»«
  75. «»«» GetLastName: PROCEDURE at end of script capitalizes Last Names »«»«
  76. «»«» -------------------------------------------------------------  «»«»
  77. »«»« | it can also be used to handle "non-conforming" Last Names |  »«»«
  78. «»«» |                e.g. "MAC ISAAC" --> "MacISAAC"            |  «»«»
  79. »«»« |                     "VON NUEMANN" --> "VonNuemann"        |  »«»«
  80. «»«» -------------------------------------------------------------  «»«»
  81. »«»« BUT: you must add the additional tests yourself (it's easy!)   »«»«
  82. «»«»                                                                «»«»
  83. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  84. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  85. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  86.  |-----------------------------------------------------------------|
  87.  |                                                                 |
  88.  | ·  all dates are in the author's suggested form:  8 Jul 1939    |
  89.  |                                                                 |
  90.  |      ( not only is 7/8/39 ambigous, it will also break )        |
  91.  |      ( my .html file naming convention in a big way    )        |
  92.  |                                                                 |
  93.  | (   To any who may ask: it would be easy code around,         ) |
  94.  | (   but the form suggested by ScionGenealogist author         ) |
  95.  | (   Robbie J Akins makes much more sense to me!               ) |
  96.  |                                                                 |
  97.  | · if Death Date is blank; Death Place can be a COMMENT field    |
  98.  |                                            e.g. Phone #         |
  99.  | · if Burial Date is blank; Burial Place can be a COMMENT field  |
  100.  |                                            e.g. Address         |
  101.   -----------------------------------------------------------------
  102.  
  103.  * Running 'rx ScionToMosaic.rexx' gives further directions
  104.  
  105.  * Briefly, · start ScionGenealogist and load a data base
  106.  *          · 'assign Genealogy: '{Scion data base directory}
  107.  *          · start a Shell, cd to wherever you have or wish to have
  108.  *               the directory of Mosaic .html's
  109.  *          · 'rx ScionToMosaic.rexx Normal' to automagically create a 
  110.  *              Mosaic .html file for each person in your 
  111.  *              ScionGenealogist data base; following the TEMPLATE:
  112.  
  113. ############# begin genealogytemplate.html #########################
  114. <HTML>
  115. <TITLE>PERSON Data Sheet</TITLE>
  116. <H2>PERSON (PERSONGENDER) <A HREF="PERSONI.html"><I>more info</I></A> (()) 
  117. <A href="Genealogy/GenealogyFile.html"><B>List of persons.</B></A></H2>
  118. <H3>
  119. Born: BIRTHDATE * BIRTHPLACE <BR>
  120. Died: DEATHDATE + DEATHPLACE . Buried: BURIALPLACE <BR>
  121. </H3>
  122. <HR>            /* NEW FORMAT BELOW */
  123. <H3>Immediate Family of <I>PERSON</I></H3>
  124. <PRE><TT>
  125.   <A HREF="FATHER.html">FATHER</A>_//\_<A HREF="MOTHER.html">MOTHER</A> & MARRIAGEDATE @ MARRIAGEPLACE
  126.   |            <A HREF="Family#I.html"><I>family info</i></A>
  127.   |_____ <A HREF="Sibling1.html">Sibling1</A> (Sibling1GENDER) * Sibling1BIRTHDATE
  128.   |_____ <A HREF="SiblingN.html">SiblingN</A> (SiblingNGENDER) * SiblingNBIRTHDATE
  129.   |             
  130.   <B>PERSON</B>_//\_<A HREF="SPOUSE1.html">SPOUSE1</A> & MARRIAGE1DATE @ MARRIAGE1PLACE
  131.   |  |  |            <A HREF="Family#I.html"><I>family info</i></A>
  132.   |  |  |_____ <A HREF="mFGRn1c1.html">mFGRn1c1</A> (mFGRn1c1GENDER) * mFGRn1c1BIRTHDATE
  133.   |  |  |_____ <A HREF="mFGRn1cN.html">mFGRn1cN</A> (mFGRn1cNGENDER) * mFGRn1cNBIRTHDATE
  134.   |  |
  135.   |  |_//\_<A HREF="SPOUSE2.html">SPOUSE2</A> & MARRIAGE2DATE @ MARRIAGE2PLACE
  136.   |    |            <A HREF="Family#I.html"><I>family info</i></A>
  137.   |    |_____ <A HREF="mFGRn2c1.html">mFGRn2c1</A> (mFGRn2c1GENDER) * mFGRn2c1BIRTHDATE
  138.   |    |_____ <A HREF="mFGRn2cN.html">mFGRn2cN</A> (mFGRn2cNGENDER) * mFGRn2cNBIRTHDATE
  139.   |
  140.   |_//\_<A HREF="SPOUSEN.html">SPOUSEN</A> & MARRIAGENDATE @ MARRIAGENPLACE
  141.     |            <A HREF="Family#I.html"><I>family info</i></A>
  142.     |_____ <A HREF="mFGRnNc1.html">mFGRnNc1</A> (mFGRnNc1GENDER) * mFGRnNc1BIRTHDATE
  143.     |_____ <A HREF="mFGRnNcN.html">mFGRnNcN</A> (mFGRnNcNGENDER) * mFGRnNcNBIRTHDATE
  144. </TT><PRE>
  145. <HR>
  146. <H3>Ancestors of <I>PERSON</I></H3>
  147. <TT>
  148.           - <A HREF="GREATGRANDFATHER.html"><B>GREATGRANDFATHER</A> (FFF) * BIRTHDATE + DEATHDATE</B>
  149.       - <A HREF="GRANDFATHER.html"><B>GRANDFATHER</A> (FF) * BIRTHDATE + DEATHDATE</B>
  150.           - <A HREF="GREATGRANDMOTHER.html"><I>GREATGRANDMOTHER</A> (FFM) * BIRTHDATE + DEATHDATE</I>
  151.   - <A HREF="FATHER.html"><B>FATHER</A> (F) * BIRTHDATE + DEATHDATE</B>
  152.           - <A HREF="GREATGRANDFATHER.html"><B>GREATGRANDFATHER</A> (FMF) * BIRTHDATE + DEATHDATE</B>
  153.       - <A HREF="GRANDMOTHER.html"><I>GRANDMOTHER</A> (FM) * BIRTHDATE + DEATHDATE</I>
  154.           - <A HREF="GREATGRANDMOTHER.html"><I>GREATGRANDMOTHER</A> (FMM) * BIRTHDATE + DEATHDATE</I>
  155. <H2>PERSON * BIRTHDATE + DEATHDATE</H2>
  156.           - <A HREF="GREATGRANDFATHER.html"><B>GREATGRANDFATHER</A> (MFF) * BIRTHDATE + DEATHDATE</B>
  157.       - <A HREF="GRANDFATHER.html"><B>GRANDFATHER</A> (MF) * BIRTHDATE + DEATHDATE</B>
  158.           - <A HREF="GREATGRANDMOTHER.html"><I>GREATGRANDMOTHER</A> (MFM) * BIRTHDATE + DEATHDATE</I>
  159.   - <A HREF="MOTHER.html"><I>MOTHER</A> (M) * BIRTHDATE + DEATHDATE</I>
  160.           - <A HREF="GREATGRANDFATHER.html"><B>GREATGRANDFATHER</A> (MMF) * BIRTHDATE + DEATHDATE</B>
  161.       - <A HREF="GRANDMOTHER.html"><I>GRANDMOTHER</A> (MM) * BIRTHDATE + DEATHDATE</I>
  162.           - <A HREF="GREATGRANDMOTHER.html"><I>GREATGRANDMOTHER</A> (MMM) * BIRTHDATE + DEATHDATE</I>
  163. </TT></PRE>
  164. <HR>
  165. <H3>
  166.      a template to represent Genealogy data in Mosaic hypertext.<BR>
  167.  * replace all ocurrences of each appropriate ITEM with ACTUAL DATA<BR>
  168.      e.g. search-replace-all PERSON with: My Name<BR>
  169.      e.g. query-search-replace MOTHER with: My Mother's Name<BR>
  170.  * judiciously edit .html file names in anchors<BR>
  171.  * add/remove lines for children, siblings, spouses as necessary<BR>
  172. <BR>
  173. bugs: I'm assuming more than 8 char file names (works in UNIX & my Amiga)<BR>
  174. <BR>
  175. for discussion: how should files be named to uniquely identify individuals?<BR>
  176. <BR>
  177.                 e.g. I have at least 3 Franz Ruff's (uncle, grandF, great-grandF)<BR>
  178.                      these are most likely not other's Franz Ruff's<BR>
  179. <BR>
  180.                 if known, birth dates could be used: "Franz Ruff 18460521.html"<BR>
  181.                                or my preferred form: "FrRuff21May1846.html"<BR>
  182.                 ( this is working well in a REXX script I am generating )<BR>
  183.                 ( to translate my >400 person data base to Mosaic.html  )<BR>
  184.                 ( on an Amiga3000 from ScionGenealogist using ARexx     )<BR>
  185. <BR>
  186.                 even these may not be unique :(
  187. </H3>
  188. </HTML>
  189. ############### end genealogytemplate.html #####################################
  190.  
  191.  * In a Mosaic file (maybe HOME PAGE) have an anchor pointing to GenealogyFile:
  192.  
  193. <A href="file://localhost/Doc:Mosaic/DBNAMEGenealogy/GenealogyFile.html">
  194. Genealogy</A>
  195.  
  196. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  197. ^^ assumes you ran 'rx ScionToMosaic.rexx Normal' in directory: Doc:Mosaic ^^
  198. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  199.  
  200.  *       You might also create an {MyGenealogy}.html file yourself in directory
  201.  *       Doc:Mosaic/DBNAMEGenealogy as a starting point, with the anchor of
  202.  
  203. <A href="file://localhost/Doc:Mosaic/DBNAMEGenealogy/MyGenealogyFile.html">
  204. My Genealogy</A>
  205.  
  206.  e.g.:
  207. _____________________________________________________________
  208.  
  209. <TITLE>FirstName LastName Genealogy </TITLE>
  210. <H1>FirstName LastName Genealogy</H1>
  211. <HR>
  212. <A HREF="GenealogyFile.html">List of Persons.</A><P>
  213.  
  214. This is the genealogy of
  215. <A href="FiLast8Jul1939.html">FirstName LastName</A>.
  216. _____________________________________________________________
  217.          ^^^^^^^^^^^^^^
  218.  * Note the convention of first 2 characters from FirstName
  219.  *                        first 4 characters from LastName
  220.  *                        & BirthDate (with all blanks removed)
  221.  *
  222.  * If the BirthDate is not entered, the convention is:
  223.  *                        first 2 characters from FirstName
  224.  *                        first 6 characters from LastName
  225.  *                        & ScionGenealogist IRN
  226.  *
  227.  
  228.  * The PN{IRN}.DBNAME files are used to generate the "more info" files.
  229.  
  230.  * Whenever the PN{IRN}.DBNAME is changed or replaced, the corresponding
  231.  * "more info" file will be updated if 'rx ScionToMosaic.rexx {IRN}' is re-run.
  232.  
  233.  * TO DO: picture file anchors? PP{IRN}.DBNAME? ILBM not portable. Convert?
  234.  
  235. */
  236.  
  237. /* add libraries */
  238.         libs = 'rexxsupport.library rexxarplib.library'
  239.         DO i = 1 TO Words(libs)
  240.                 lib = Word(libs,i)
  241.                 IF ~Show('Lib',lib) THEN DO
  242.                         IF EXISTS('LIBS:'lib) then call addlib lib, 0, -30
  243.                         ELSE DO
  244.                                 'message "===> cannot find' lib 'in LIBS:"'
  245.                                 EXIT 10
  246.                         END
  247.                 END
  248.         END i
  249.  
  250. IF ~Show(p,'SCIONGEN') THEN DO
  251.     SAY ' '
  252.     SAY '    Cannot proceed because ScionGenealogist is NOT currently running:'
  253.     SAY ' '
  254.     SAY '    1. Please start ScionGenealogist and'
  255.     SAY ' '
  256.     SAY '    2. load the desired data base. Then:'
  257.     SAY ' '
  258.     SAY '    3. rx ScionToMosaic.rexx Normal'
  259.     SAY ' '
  260.     EXIT
  261.     END
  262.  
  263. Address "SCIONGEN"    /* Point at Scion Genealogist port */
  264. options RESULTS
  265.  
  266. 'GETDBNAME'        /* Issue GET DB NAME command to Scion Genealogist */
  267. DBNAME = RESULT
  268.  
  269. PARSE ARG target
  270. DO WHILE target = ""
  271.     SAY ' '
  272.     SAY ' Enter "Normal" to recreates all PERSON.html files; or'
  273.     SAY ' '
  274.     SAY ' a 'DBNAME' Scion data base "IRN" to recreate a specific PERSON.html file.'
  275.     SAY ' '
  276.     PULL target
  277. /*    EXIT    */
  278. /*    ELSE    target = Upper(target)    */
  279.  
  280. target = Upper(strip(target,,'"'))    /* just in case, remove errant quotes    */
  281. END
  282.  
  283. IF target = 'Q' | target = 'EXIT' | target = 'QUIT' THEN
  284.     EXIT
  285.  
  286. IF target = '?' | target = 'H' | target = 'HELP' THEN DO
  287.     SAY ' '
  288.     SAY '        please send comments, questions to:'
  289.     SAY ' '
  290.     SAY '            ipolyi@pat.mdc.com'
  291.     SAY '                or:'
  292.     SAY '            Harold H. Ipolyi '
  293.     SAY '             P.O.Box 891206 '
  294.     SAY '             Houston, Tx 77289-1206 '
  295.     SAY ' '
  296.     SAY ' /¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\'
  297.     SAY '   Convert ScionGenealogist data base to Mosaic .html hypertext.  '
  298.     SAY ' \_______________________________________________________________/'
  299.     SAY ' '
  300.     SAY ' Usage: rx ScionToMosaic.rexx Normal {recreates all PERSON.html files}'
  301.     SAY '        rx ScionToMosaic.rexx IRN    {recreates a specific PERSON.html file}'
  302.     SAY ' '
  303.     EXIT
  304.     END    
  305.  
  306. IF target = 'N' THEN
  307.     target = 'NORMAL'
  308. IF target = 'T' THEN
  309.     target = 'TEST'
  310.  
  311. /*    SAY target    */
  312.  
  313. 'GETPROGVERSION'
  314. VERSION = RESULT
  315.  
  316. IF VERSION < 3.13 THEN DO
  317.     SAY ' '
  318.     say ' Requires VERSION = 3.13 or greater'
  319.     SAY ' '
  320.     EXIT
  321.     END
  322.             /* ??? GETDBDIRPATH ??? of Scion data base */
  323.  
  324. SAY ' '
  325. Say ' Testing: is data base assignment of Genealogy:'DBNAME' visible?'
  326. SAY ' '
  327.  
  328. PRAGMA('w','n')
  329. IF ~Exists("Genealogy:"DBNAME) THEN DO
  330.     SAY '     Genealogy:'DBNAME' not found,'
  331.     SAY ' '
  332.     SAY "     Please create an assign to data base "DBNAME"'s directory:"
  333.     SAY ' '
  334.     SAY ' assign Genealogy: {Volume:Directory}'
  335.     SAY ' '
  336.     EXIT
  337.     END
  338. PRAGMA('w','w')
  339.  
  340. Gdir = DBNAME'Genealogy'
  341. Tdir = DBNAME'Text'
  342.  
  343. IF ~Makedir(Gdir) THEN DO
  344.     SAY ' '
  345.     SAY ' ===> unable to create directory: 'Gdir
  346.     SAY ' '
  347.     EXIT
  348.     END
  349.  
  350. IF ~Makedir(Tdir) THEN DO
  351.     SAY ' '
  352.     SAY ' ===> unable to create directory: 'Tdir
  353.     SAY ' '
  354.     EXIT
  355.     END
  356.  
  357.  
  358. 'GETTOTALIRN'        /* Issue command to Scion Genealogist */
  359.     TOTALIRN = RESULT
  360.  
  361. Say "Number of people in database " DBNAME " = " TOTALIRN
  362. SAY ' '
  363.  
  364. 'GETPERSLABEL' 1
  365. PERSLABEL1 = RESULT
  366. 'GETPERSLABEL' 2
  367. PERSLABEL2 = RESULT
  368. 'GETPERSLABEL' 3
  369. PERSLABEL3 = RESULT
  370. 'GETFAMLABEL' 1
  371. FAMLABEL1 = RESULT
  372. 'GETFAMLABEL' 2
  373. FAMLABEL2 = RESULT
  374. IF IsNumeric(target) THEN
  375.     DO
  376.     Say 'Processing person ' target ' of ' TOTALIRN ' in database ' DBNAME
  377.  
  378.     IF target <= TOTALIRN THEN DO
  379. /*        Open('GenealogyText' @,Tdir'/GenealogyOf'target,'w')    */
  380.         Open('GenealogyText',Tdir'/G'target,'w')
  381.         CALL MakeOne(target,0)
  382.         Close('GenealogyText')
  383.         END
  384.     END
  385. ELSE
  386.     DO
  387.     target = Upper(target)
  388.     IF target = "TEST" THEN DO
  389.  
  390.         DO i = 1 TO 7
  391. /*        Open('GenealogyText',Tdir'/GenealogyOf'i,'w')    */
  392.         Open('GenealogyText',Tdir'/G'i,'w')
  393.         CALL MakeOne(i,0)
  394.         Close('GenealogyText')
  395.             END
  396.         END
  397.     ELSE
  398.         DO
  399.         Say "Processing all " TOTALIRN " persons in database " DBNAME
  400.  
  401. /* GenealogyFile.html is a Scion data base IRN order list of all persons in 
  402.    Mosaic .html format, format:
  403.  
  404.    person * birthdate + deathdate (()) father //\ mother    */
  405.  
  406. Say 'Mosaic file name: 'Gdir'/GenealogyFile.html for: List of Persons.'
  407.  
  408.         Open('GenealogyFile',Gdir'/GenealogyFile.html','w')
  409.         WriteLn('GenealogyFile','<HTML>')
  410.         WriteLn('GenealogyFile','<TITLE>List of Persons.</TITLE>')
  411. WriteLn('GenealogyFile','<H2>List of Persons in data base "'DBNAME'". <B>'Time()' - 'Date()'</B></H2>')
  412.         WriteLn('GenealogyFile','<H3>')
  413.  
  414.         Open('GenealogyText',Tdir'/GenealogyOf'DBNAME,'w')
  415.         WriteLn('GenealogyText','Genealogy Data Base "'GetLastName(DBNAME)'"')
  416.         WriteLn('GenealogyText','')
  417.         WriteLn('GenealogyText','-----------------------------------------------------------')
  418.         WriteLn('GenealogyText','')
  419.  
  420.         DO i = 1 TO TOTALIRN
  421.             CALL MakeOne(i,1)
  422.             END
  423.         WriteLn('GenealogyFile','</H3>')
  424.         WriteLn('GenealogyFile','<HR>')
  425.         WriteLn('GenealogyFile','<Address>')
  426.         'GETPROGVERSION'
  427.         VERSION = RESULT
  428.         WriteCh('GenealogyFile','<H3>ScionGenealogist')
  429.         IF VERSION > 0 THEN WriteCh('GenealogyFile',' V 'VERSION)
  430.         WriteLn('GenealogyFile',' © Robbie J Akins; ')
  431.         WriteLn('GenealogyFile','Scion'VERSION'ToMosaic.rexx © Harold Ipolyi</H3>')
  432.         WriteLn('GenealogyFile','</Address>')
  433.         WriteLn('GenealogyFile','</HTML>')
  434.         END
  435. Say ' '
  436. ThisPath = PRAGMA('d')
  437. IF Substr(ThisPath,Length(ThisPath),Length(ThisPath)) ~= ":" THEN ThisPath = ThisPath'/'
  438. Say ' ---------------------------------------------------------------------'
  439. Say ' If you have not already done so, add the following anchor pointing to'
  440. Say ' "'GetLastName(DBNAME)' Genealogy" to a Mosaic file (maybe HOME PAGE):'
  441. Say ' ---------------------------------------------------------------------'
  442. Say ' <A href="/'ThisPath||Gdir'/GenealogyFile.html">'GetLastName(DBNAME)' Genealogy</A>'
  443. Say ' ------------------------------------------------------------------'
  444.     END
  445. SAY ' '
  446. Say 'ScionToMosaic.rexx completed normally'
  447. EXIT
  448.  
  449. /*************************************************************************/
  450.  
  451. MakeOne: PROCEDURE EXPOSE target DBNAME Gdir Tdir FAMLABEL1 FAMLABEL2 PERSLABEL1 PERSLABEL2 PERSLABEL3
  452.     PARSE ARG ScionIRN, EndOfFile
  453. 'EXISTPERSON' ScionIRN
  454. /**/
  455. if RESULT = 'YES' THEN DO
  456. /**/
  457.     HasFileFATHER = 0
  458.     HasFileMOTHER = 0
  459.     HasMOTHER = 0
  460.     HasFATHER = 0
  461.     HasPARENTS = 0
  462.     HasCHILDREN = 0
  463.     DoGenText = 0
  464.     'GETPARENTS' ScionIRN
  465.     PARENTS = RESULT
  466.         tPARENTSt = 't'PARENTS't'
  467. /*    Say 'PARENTS = 'PARENTS tPARENTSt    ??? EXISTPARENTS IRN ???    */
  468.     IF tPARENTSt ~= 'tt' THEN HasPARENTS = 1
  469.     'GETMARRIAGE' ScionIRN 0    /*      ??? GETTOTMARRIAGES IRN ???     */
  470.     MARRIAGE = RESULT
  471.     tMARRIAGESt = 't'MARRIAGE't'
  472. /*    Say 'MARRIAGES = 'MARRIAGE tMARRIAGESt        */
  473.     IF tMARRIAGESt ~= 'tMARRIAGEt' THEN DO
  474.         mFGRN = MARRIAGE
  475.         'GETCHILD' mFGRN 0    /*    ??? GETTOTCHILDREN FGRN ???    */
  476.         'EXISTPERSON' RESULT
  477.         if RESULT = 'YES' then HasCHILDREN = 1        
  478.     END
  479. /*
  480. Say 'PARENTS = 'PARENTS tPARENTSt 'MARRIAGES = 'MARRIAGES tMARRIAGESt 'HasPARENTS = 'HasPARENTS 'HasCHILDREN = 'HasCHILDREN
  481. */
  482.     IF ( HasPARENTS + HasCHILDREN ) = 1 THEN DoGenText = 1
  483. /**/
  484.     'GETLASTNAME' ScionIRN
  485.     LASTNAME = GetLastName(RESULT)
  486.     'GETFIRSTNAME' ScionIRN
  487.     FIRSTNAME = RESULT
  488.     'GETSEX' ScionIRN
  489.     GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  490.     thelastname = LASTNAME
  491.     thegender = GENDER
  492.     FULLNAME = GetFullName(FIRSTNAME)
  493.     MFULLNAME = MGetFullName(FIRSTNAME)
  494.     PFULLNAME = PGetFullName(FIRSTNAME)
  495.     'GETBIRTHDATE' ScionIRN
  496.     BIRTHDATE = RESULT
  497.     'GETBIRTHPLACE' ScionIRN
  498.     BIRTHPLACE = RESULT
  499.     'GETDEATHDATE' ScionIRN
  500.     DEATHDATE = RESULT
  501.     'GETDEATHPLACE' ScionIRN
  502.     DEATHPLACE = RESULT
  503.     'GETBURIALPLACE' ScionIRN
  504.     BURIALPLACE = RESULT
  505.     'GETPERSUSER1' ScionIRN
  506.     PERSUSER1 = CheckForReplacement(RESULT)
  507.     PERSUSERn1 = CheckForNAReplacement(RESULT)
  508.     'GETPERSUSER2' ScionIRN
  509.     PERSUSER2 = CheckForReplacement(RESULT)
  510.     PERSUSERn2 = CheckForNAReplacement(RESULT)
  511.     'GETPERSUSER3' ScionIRN
  512.     PERSUSER3 = CheckForReplacement(RESULT)
  513.     PERSUSERn3 = CheckForNAReplacement(RESULT)
  514. IF target ~= "NORMAL" | BIRTHPLACE ~= "" | DEATHPLACE ~= "" | BURIALPLACE ~= "" | PERSUSER1 ~= "" | PERSUSER2 ~= "" | PERSUSER3 ~= "" THEN DoGenText = 1
  515. /**/
  516.     IF LASTNAME = "" THEN DO
  517. Say "Person " ScionIRN"'s last name is not defined; no new Mosaic file being created!"
  518.         RETURN
  519.         END
  520.     IF BIRTHDATE = "" THEN
  521.         PERSONFILENAME = Space(substr(FIRSTNAME,1,2) substr(LASTNAME,1,6) ScionIRN)
  522.     ELSE
  523.         PERSONFILENAME = Space(substr(FIRSTNAME,1,2) substr(LASTNAME,1,4) BIRTHDATE)
  524. /**/
  525.     PfilN = Gdir'/'PERSONFILENAME
  526.     Say ''
  527.     Say 'Mosaic file: 'PfilN'.html for: 'FULLNAME' {'ScionIRN'}'
  528.     Open('PERSONFILE',PfilN'.html','w')
  529.     WriteLn('PERSONFILE','<HTML>')
  530.     WriteLn('PERSONFILE','<TITLE>'FULLNAME' Data Sheet</TITLE>')
  531.     WriteCh('PERSONFILE','<H2>'MFULLNAME)
  532. /**/
  533.     IF Exists('Genealogy:PN'ScionIRN'.'DBNAME) THEN DO
  534.         Say 'Writing info file 'PfilN'I.html'
  535.         Open('PNDBNAME','Genealogy:PN'ScionIRN'.'DBNAME,'r')
  536.         Open('PERSONI',PfilN'I.html','w')
  537.         WriteLn('PERSONI','<HTML>')
  538.         WriteLn('PERSONI','<TITLE>'FULLNAME' Information</TITLE>')
  539.         WriteCh('PERSONI','<H2><A HREF="'PERSONFILENAME'.html">'MFULLNAME)
  540.         WriteCh('PERSONI','</A> Information. <A HREF="GenealogyFile.html">')
  541.         WriteLn('PERSONI','<B>List of Persons.</B></A></H2><PRE><TT>')
  542.         IF DoGenText THEN WriteLn('GenealogyText',PFULLNAME' Information.')
  543.         DO While ~EOF('PNDBNAME')
  544.             line = ReadLn('PNDBNAME')
  545.             WriteLn('PERSONI',CheckForReplacement(line))
  546.             IF DoGenText THEN WriteLn('GenealogyText',CheckForNAReplacement(line))
  547.             END
  548.         Close('PNDBNAME')
  549.         IF DoGenText THEN WriteLn('GenealogyText',' ')
  550.         WriteLn('PERSONI','</HTML>')
  551.         Close('PERSONI')
  552. WriteCh('PERSONFILE',' (<A HREF="'PERSONFILENAME'I.html"><B>more info</B></A>)')
  553.         END
  554. /**/
  555.     WriteLn('PERSONFILE',' <A HREF="GenealogyFile.html"><B>List of Persons.</B></A></H2><H3>')
  556.     IF DoGenText THEN DO
  557. /*        IF target ~= "NORMAL" THEN Say 'Printable file: 'Tdir'/GenealogyOf'ScionIRN' for 'FULLNAME' {'ScionIRN'}'    */
  558.         IF target ~= "NORMAL" THEN Say 'Printable file: 'Tdir'/G'ScionIRN' for 'FULLNAME' {'ScionIRN'}'
  559.         WriteLn('GenealogyText','')
  560.         WriteLn('GenealogyText','-----------------------------------------------------------')
  561.         WriteLn('GenealogyText','')
  562.         WriteLn('GenealogyText',PFULLNAME' Data Sheet')
  563.         END
  564.     IF BIRTHDATE || BIRTHPLACE ~= "" THEN DO
  565.         WriteCh('PERSONFILE','Born: ')
  566.         IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',BIRTHDATE)
  567.         IF BIRTHPLACE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHPLACE)
  568.         WriteLn('PERSONFILE','<BR>')
  569.         IF BIRTHDATE ~= "" THEN IF DoGenText THEN WriteCh('GenealogyText','Born: 'BIRTHDATE)
  570.         IF BIRTHPLACE ~= "" THEN IF DoGenText THEN WriteCh('GenealogyText',' * 'BIRTHPLACE)
  571.         IF DoGenText THEN WriteLn('GenealogyText','')
  572.         END
  573.     IF DEATHDATE ~= "" THEN    DO
  574.         WriteCh('PERSONFILE','Died: 'DEATHDATE' + 'DEATHPLACE)
  575.         IF DoGenText THEN WriteCh('GenealogyText','Died: 'DEATHDATE' + 'DEATHPLACE)
  576.         IF BURIALPLACE ~= "" THEN DO
  577.             WriteCh('PERSONFILE',' . Buried: 'BURIALPLACE)
  578.             IF DoGenText THEN WriteCh('GenealogyText',' . Buried: 'BURIALPLACE)
  579.             END
  580.         WriteLn('PERSONFILE','<BR>')
  581.         IF DoGenText THEN WriteLn('GenealogyText','')
  582.         END
  583.     ELSE DO
  584.         IF DEATHPLACE ~= "" THEN DO
  585.             WriteLn('PERSONFILE',DEATHPLACE'<BR>')
  586.             IF DoGenText THEN WriteLn('GenealogyText',DEATHPLACE)
  587.             END
  588.         IF BURIALPLACE ~= "" THEN DO
  589.             WriteLn('PERSONFILE',BURIALPLACE'<BR>')
  590.             IF DoGenText THEN WriteLn('GenealogyText',BURIALPLACE)
  591.             END
  592.         END
  593.     IF PERSUSER1 ~= "" THEN DO
  594.         WriteLn('PERSONFILE',PERSLABEL1': 'PERSUSER1'<BR>')
  595.         IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL1': 'PERSUSERn1)
  596.         END
  597.     IF PERSUSER2 ~= "" THEN DO
  598.         WriteLn('PERSONFILE',PERSLABEL2': 'PERSUSER2'<BR>')
  599.         IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL2': 'PERSUSERn2)
  600.         END
  601.     IF PERSUSER3 ~= "" THEN DO
  602.         WriteLn('PERSONFILE',PERSLABEL3': 'PERSUSER3'<BR>')
  603.         IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL3': 'PERSUSERn3)
  604.         END
  605.  
  606. /* end of personal data; start family tree segment */
  607.  
  608.     WriteLn('PERSONFILE','<HR>')
  609.     IF DoGenText THEN DO
  610.         WriteLn('GenealogyText','')
  611.         WriteLn('GenealogyText','-----------------------------------------------------------')
  612.         WriteLn('GenealogyText','')
  613.         END
  614.     WriteCh('PERSONFILE','<H3>Immediate Family of 'MFULLNAME'</H3>')
  615.     IF DoGenText THEN DO
  616.         WriteLn('GenealogyText','Immediate Family of 'PFULLNAME)
  617.         WriteLn('GenealogyText','')
  618.         END
  619.     WriteLn('PERSONFILE','<PRE><TT>')
  620. /**/
  621.     IF HasPARENTS THEN DO
  622.         'GETPRINCIPAL' PARENTS
  623.         PRINCIPAL = RESULT
  624.         'GETSPOUSE' PARENTS
  625.         SPOUSE = RESULT
  626.         'GETMARRYDATE' PARENTS
  627.         PARENTSMARRIAGEDATE = RESULT
  628.         'GETMARRYPLACE' PARENTS
  629.         PARENTSmFGRNPLACE = RESULT
  630.         'GETFAMUSER1' PARENTS
  631.         PARENTSmFGRNCELEBRANT = CheckForReplacement(RESULT)
  632.         PARENTSnmFGRNCELEBRANT = CheckForNAReplacement(RESULT)
  633.         'GETFAMUSER2' PARENTS
  634.         PARENTSmFGRNCOMMENT = CheckForReplacement(RESULT)
  635.         PARENTSnmFGRNCOMMENT = CheckForNAReplacement(RESULT)
  636.         'GETSEX' PRINCIPAL
  637.         IF RESULT = 'M' THEN
  638.             DO
  639.             FATHERScionIRN = PRINCIPAL
  640.             MOTHERScionIRN = SPOUSE
  641.             END
  642.         ELSE
  643.             DO
  644.             FATHERScionIRN = SPOUSE
  645.             MOTHERScionIRN = PRINCIPAL
  646.             END
  647.         'GETLASTNAME' FATHERScionIRN
  648.         FATHERLASTNAME = GetLastName(RESULT)
  649.         'GETFIRSTNAME' FATHERScionIRN
  650.         FATHERFIRSTNAME = RESULT
  651.         IF FATHERFIRSTNAME ~= "" | FATHERLASTNAME ~= "" THEN HasFATHER = 1
  652.         thelastname = FATHERLASTNAME
  653.         thegender = "m"
  654. FATHERFULLNAME = GetFullName(FATHERFIRSTNAME)
  655. MFATHERFULLNAME = MGetFullName(FATHERFIRSTNAME)
  656. PFATHERFULLNAME = PGetFullName(FATHERFIRSTNAME)
  657.         'GETBIRTHDATE' FATHERScionIRN
  658.         FATHERBIRTHDATE = RESULT
  659.         'GETLASTNAME' MOTHERScionIRN
  660.         MOTHERLASTNAME = GetLastName(RESULT)
  661.         'GETFIRSTNAME' MOTHERScionIRN
  662.         MOTHERFIRSTNAME = RESULT
  663.         IF MOTHERFIRSTNAME ~= "" | MOTHERLASTNAME ~= "" THEN HasMOTHER = 1
  664.         thelastname = MOTHERLASTNAME
  665.         thegender = "f"
  666. MOTHERFULLNAME = GetFullName(MOTHERFIRSTNAME)
  667. MMOTHERFULLNAME = MGetFullName(MOTHERFIRSTNAME)
  668. PMOTHERFULLNAME = PGetFullName(MOTHERFIRSTNAME)
  669.         'GETBIRTHDATE' MOTHERScionIRN
  670.         MOTHERBIRTHDATE = RESULT
  671. /**/
  672.         IF FATHERLASTNAME ~= "" THEN DO
  673.             HasFileFATHER = 1
  674.             IF FATHERBIRTHDATE = "" THEN DO
  675. FATHERFILENAME = Space(substr(FATHERFIRSTNAME,1,2) substr(FATHERLASTNAME,1,6) FATHERScionIRN)
  676.                 END
  677.             ELSE DO
  678. FATHERFILENAME = Space(substr(FATHERFIRSTNAME,1,2) substr(FATHERLASTNAME,1,4) FATHERBIRTHDATE)
  679.                 END        
  680.             END        
  681. /**/
  682.         IF MOTHERLASTNAME ~= "" THEN DO
  683.             HasFileMOTHER = 1
  684.             IF MOTHERBIRTHDATE = "" THEN DO
  685. MOTHERFILENAME = Space(substr(MOTHERFIRSTNAME,1,2) substr(MOTHERLASTNAME,1,6) MOTHERScionIRN)
  686.                 END
  687.             ELSE DO
  688. MOTHERFILENAME = Space(substr(MOTHERFIRSTNAME,1,2) substr(MOTHERLASTNAME,1,4) MOTHERBIRTHDATE)
  689.                 END
  690.             END        
  691. /**/
  692.         WriteCh('PERSONFILE','  ')
  693.         IF HasFileFATHER THEN WriteCh('PERSONFILE','<A HREF="'FATHERFILENAME'.html">')
  694.         WriteCh('PERSONFILE',MFATHERFULLNAME)
  695.         IF HasFileFATHER THEN WriteCh('PERSONFILE','</A> //\ ')
  696.         IF HasFileMOTHER THEN WriteCh('PERSONFILE','<A HREF="'MOTHERFILENAME'.html">')
  697.         WriteCh('PERSONFILE',MMOTHERFULLNAME)
  698.         IF HasFileMOTHER THEN WriteCh('PERSONFILE','</A>')
  699. /**/
  700.         IF PARENTSMARRIAGEDATE ~= "" THEN
  701. WriteCh('PERSONFILE',' & 'PARENTSMARRIAGEDATE)
  702.         IF PARENTSmFGRNPLACE ~= "" THEN
  703. WriteCh('PERSONFILE',' @ 'PARENTSmFGRNPLACE)
  704. /**/
  705.         WriteLn('PERSONFILE','')
  706.         IF DoGenText THEN DO
  707.             WriteCh('GenealogyText','  'PFATHERFULLNAME' //\ 'PMOTHERFULLNAME)
  708.     IF PARENTSMARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'PARENTSMARRIAGEDATE)
  709.     IF PARENTSmFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'PARENTSmFGRNPLACE)
  710.             WriteLn('GenealogyText','')
  711.             END
  712.         spcs = '  |'
  713.         DO i = 0 TO Length(FATHERFULLNAME)
  714.             spcs = spcs' '        /*    ??? GETFAMLBL1 ???    */
  715.         END                /*    ??? GETFAMLBL2 ???    */
  716. /**/
  717.     FfilN = Gdir'/Family'PARENTS
  718.     IF Exists(FfilN'I.html') THEN DO
  719.         IF Exists('Genealogy:FN'PARENTS'.'DBNAME) THEN DO
  720. Parse value StateF(FfilN'I.html') with type size blk bits PFday PFmin PFtick com
  721. Parse value StateF('Genealogy:FN'PARENTS'.'DBNAME) with type size blk bits PNday PNmin PNtick com
  722. /* Say PERSONFILENAME'I.html' PFday PFmin PFtick  'Genealogy:FN'PARENTS'.'DBNAME PNday PNmin PNtick */
  723.             IF ( PNday > PFday ) | ( PNday = PFday & PNmin > PFmin ) THEN DO
  724.                 Delete(FfilN'I.html')
  725. Say 'Scion file Genealogy:FN'PARENTS'.'DBNAME 'newer; replacing 'FfilN'I.html'
  726.                 END
  727.             END
  728.         END
  729. /**/
  730.         Minfo = 0
  731.     IF Exists(FfilN'I.html') THEN
  732.         Minfo = 1
  733. /*    WriteCh('PERSONFILE',' (<A HREF="'PERSONFILENAME'I.html"><B>more info</B></A>)')    */
  734.     ELSE DO
  735.         IF Exists('Genealogy:FN'PARENTS'.'DBNAME) THEN DO
  736.             Minfo = 1
  737.             Say 'Writing info file 'FfilN'I.html'
  738.             Open('FNDBNAME','Genealogy:FN'PARENTS'.'DBNAME,'r')
  739.             Open('FAMILYI',FfilN'I.html','w')
  740.     WriteLn('FAMILYI','<HTML>')
  741.     WriteLn('FAMILYI','<TITLE>'FATHERFULLNAME' Family Information</TITLE>')
  742.     WriteCh('FAMILYI','<H2><A HREF="GenealogyFile.html">')
  743.     WriteLn('FAMILYI','<B>List of Persons.</B></A></H2><PRE><TT>')
  744.             DO While ~EOF('FNDBNAME')
  745.                 line = ReadLn('FNDBNAME')
  746.                 WriteLn('FAMILYI',line)
  747.             END
  748.             Close('FNDBNAME')
  749.             WriteLn('FAMILYI','</HTML>')
  750.             Close('FAMILYI')
  751. /*    WriteCh('PERSONFILE',' (<A HREF="'PERSONFILENAME'I.html"><B>more info</B></A>)')    */
  752.             END
  753.         END
  754. /**/
  755.     IF PARENTSmFGRNCELEBRANT ~= '' | Minfo THEN DO
  756.         WriteCh('PERSONFILE',spcs)
  757.         IF Minfo THEN
  758.             WriteCh('PERSONFILE','(<A HREF="Family'PARENTS'I.html"><B>family info</B></A>) ')
  759.         IF PARENTSmFGRNCELEBRANT ~= '' THEN DO
  760.             WriteCh('PERSONFILE',FAMLABEL1': 'PARENTSmFGRNCELEBRANT)
  761.             IF DoGenText THEN WriteLn('GenealogyText',spcs||FAMLABEL1': 'PARENTSnmFGRNCELEBRANT)
  762.             END
  763.         WriteLn('PERSONFILE','')
  764.         END
  765. IF PARENTSmFGRNCOMMENT ~= '' THEN DO
  766.     WriteLn('PERSONFILE',spcs' 'FAMLABEL2': 'PARENTSmFGRNCOMMENT)
  767.     IF DoGenText THEN WriteLn('GenealogyText',spcs' 'FAMLABEL2': 'PARENTSnmFGRNCOMMENT)
  768.         END
  769.         DO i = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */
  770.             'GETCHILD' PARENTS i
  771.             PARENTSc = RESULT
  772.             'GETFIRSTNAME' PARENTSc
  773.             PARENTScFIRSTNAME = RESULT
  774. /**/
  775.             IF PARENTScFIRSTNAME ~= "" THEN DO
  776.                 IF PARENTSc ~= ScionIRN THEN DO
  777.                     'GETLASTNAME' PARENTSc
  778.                     PARENTScLASTNAME = GetLastName(RESULT)
  779.                     'GETFIRSTNAME' PARENTSc
  780.                     PARENTScFIRSTNAME = RESULT
  781.                     'GETSEX' PARENTSc
  782. PARENTScGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  783.                     thelastname = PARENTScLASTNAME
  784.                     thegender = PARENTScGENDER
  785. PARENTScFULLNAME = GetFullName(PARENTScFIRSTNAME)
  786. MPARENTScFULLNAME = MGetFullName(PARENTScFIRSTNAME)
  787. PPARENTScFULLNAME = PGetFullName(PARENTScFIRSTNAME)
  788.                     'GETBIRTHDATE' PARENTSc
  789.                     PARENTScBIRTHDATE = RESULT
  790.                     'GETDEATHDATE' PARENTSc
  791.                     PARENTScDEATHDATE = RESULT
  792. /**/
  793.                     IF PARENTScBIRTHDATE = "" THEN
  794. PARENTScFILENAME = Space(substr(PARENTScFIRSTNAME,1,2) substr(PARENTScLASTNAME,1,6) PARENTSc)
  795.                     ELSE
  796. PARENTScFILENAME = Space(substr(PARENTScFIRSTNAME,1,2) substr(PARENTScLASTNAME,1,4) PARENTScBIRTHDATE)
  797. /**/
  798. WriteCh('PERSONFILE','  |_____ <A HREF="'PARENTScFILENAME'.html">')
  799. /**/
  800.                     IF PARENTScLASTNAME ~= FATHERLASTNAME THEN
  801. WriteCh('PERSONFILE',MPARENTScFULLNAME)
  802.                     ELSE DO
  803. IF PARENTScGENDER = "m" THEN WriteCh('PERSONFILE','<B>'PARENTScFIRSTNAME'</B>')
  804. IF PARENTScGENDER = "f" THEN WriteCh('PERSONFILE','<I>'PARENTScFIRSTNAME'</I>')
  805.                         END
  806. /**/
  807. WriteCh('PERSONFILE','</A> ')
  808. /**/
  809.                     IF PARENTScBIRTHDATE ~= "" THEN
  810. WriteCh('PERSONFILE','   * 'PARENTScBIRTHDATE)
  811. /**/
  812.                     IF PARENTScDEATHDATE ~= "" THEN
  813. WriteCh('PERSONFILE','   + 'PARENTScDEATHDATE)
  814. /**/
  815. WriteLn('PERSONFILE','')
  816. IF DoGenText THEN DO
  817.     WriteCh('GenealogyText','  |_____  'PPARENTScFULLNAME)
  818. IF PARENTScBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'PARENTScBIRTHDATE)
  819. IF PARENTScDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'PARENTScDEATHDATE)
  820. WriteLn('GenealogyText','')
  821.     END
  822.                     END
  823.                 END
  824.             END
  825.         END
  826.     END
  827.  
  828. /* end of parents, siblings segment; start marriages segment */
  829.  
  830.         vert.0 = ''
  831.         vert.1 = ' |'
  832.         DO i = 0 TO 39                  /*      ??? GETTOTMARRIAGES IRN ???     */
  833.                 'GETMARRIAGE' ScionIRN i
  834.                 MARRIAGE = RESULT               /* use: 'EXISTFAMILY'   */
  835.                 IF MARRIAGE > -1 THEN DO
  836.                         MARRIAGES = i
  837.                         j = i + 1
  838.                         vert.j = vert.i vert.1
  839.                         END
  840.         END
  841.         tMARRIAGESt = 't'MARRIAGES't'
  842. /*    Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt    */
  843.  
  844.     IF tMARRIAGESt ~= 'tMARRIAGESt' THEN DO
  845.         WriteLn('PERSONFILE','  |')
  846.         IF DoGenText THEN WriteLn('GenealogyText','  |')
  847.         DO i = 0 TO MARRIAGES
  848.             'GETMARRIAGE' ScionIRN i
  849.             mFGRN = RESULT
  850.             IF mFGRN ~= "" THEN DO
  851.                 ki = MARRIAGES - i + 1
  852.                 IF ki ~= MARRIAGES + 1 THEN DO
  853.                     WriteLn('PERSONFILE',vert.ki)
  854.                     IF DoGenText THEN WriteLn('GenealogyText',vert.ki)
  855.                     END
  856.                 j = MARRIAGES + 1 - i
  857.                 'GETSPOUSE' mFGRN
  858.                 SPOUSE = RESULT
  859.                 IF SPOUSE = ScionIRN THEN
  860.                     DO
  861.                     'GETPRINCIPAL' mFGRN
  862.                     SPOUSE = RESULT
  863.                     END
  864.                 'GETLASTNAME' SPOUSE
  865.                 SPOUSELASTNAME = GetLastName(RESULT)
  866.                 'GETFIRSTNAME' SPOUSE
  867.                 SPOUSEFIRSTNAME = RESULT
  868.                 thelastname = SPOUSELASTNAME
  869.                 'GETSEX' SPOUSE
  870.                 thegender = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  871. SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  872. MSPOUSEFULLNAME = MGetFullName(SPOUSEFIRSTNAME)
  873. PSPOUSEFULLNAME = PGetFullName(SPOUSEFIRSTNAME)
  874.                 'GETBIRTHDATE' SPOUSE
  875.                 SPOUSEBIRTHDATE = RESULT
  876.                 'GETMARRYDATE' mFGRN
  877.                 MARRIAGEDATE = RESULT
  878.                 'GETMARRYPLACE' mFGRN
  879.                 mFGRNPLACE = RESULT
  880.                 'GETFAMUSER1' mFGRN
  881.                 MARRIAGECELEBRANT = CheckForReplacement(RESULT)
  882.                 MARRIAGEnCELEBRANT = CheckForNAReplacement(RESULT)
  883.                 'GETFAMUSER2' mFGRN
  884.                 MARRIAGECOMMENT = CheckForReplacement(RESULT)
  885.                 MARRIAGEnCOMMENT = CheckForNAReplacement(RESULT)
  886. /**/
  887.                 IF SPOUSEBIRTHDATE = "" THEN
  888. SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,6) SPOUSE)
  889.                 ELSE
  890. SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,4) SPOUSEBIRTHDATE)
  891. /**/
  892.                 IF i = 0 THEN DO
  893. WriteCh('PERSONFILE','  'MFULLNAME' //\ ')
  894.  
  895.                     IF SPOUSELASTNAME ~= "" THEN
  896. WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.html">')
  897.  
  898. WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  899.  
  900.                     IF SPOUSELASTNAME ~= "" THEN
  901. WriteCh('PERSONFILE','</A>')
  902.  
  903. IF DoGenText THEN DO
  904.     WriteCh('GenealogyText','  'PFULLNAME' //\ 'PSPOUSEFULLNAME)
  905.     IF MARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'MARRIAGEDATE)
  906.     IF mFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'mFGRNPLACE)
  907.     WriteLn('GenealogyText','')
  908.     END
  909.                     END
  910.  
  911.                 ELSE DO
  912. WriteCh('PERSONFILE',vert.j'_ //\ ')
  913.  
  914.                     IF SPOUSELASTNAME ~= "" THEN
  915. WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.html">')
  916.  
  917. WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  918.  
  919.                     IF SPOUSELASTNAME ~= "" THEN
  920. WriteCh('PERSONFILE','</A>')
  921.  
  922. IF DoGenText THEN DO
  923.     WriteCh('GenealogyText',vert.j'_ //\ 'PSPOUSEFULLNAME)
  924.     IF MARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'MARRIAGEDATE)
  925.     IF mFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'mFGRNPLACE)
  926.     WriteLn('GenealogyText','')
  927.     END
  928.                     END
  929.  
  930.                 IF MARRIAGEDATE ~= "" THEN
  931. WriteCh('PERSONFILE',' & 'MARRIAGEDATE)
  932.                 IF mFGRNPLACE ~= "" THEN
  933. WriteCh('PERSONFILE',' @ 'mFGRNPLACE)
  934.  
  935.                 WriteLn('PERSONFILE','')
  936.                 jk = MARRIAGES - i
  937.                 spcs = vert.jk'      |     '
  938. /**/
  939.                 FfilN = Gdir'/Family'mFGRN
  940.                 Minfo = 0
  941.                 IF Exists('Genealogy:FN'mFGRN'.'DBNAME) THEN DO
  942.                     Minfo = 1
  943.                     Say 'Writing info file 'FfilN'I.html'
  944.                     Open('FNDBNAME','Genealogy:FN'mFGRN'.'DBNAME,'r')
  945.                     Open('FAMILYI',FfilN'I.html','w')
  946. WriteLn('FAMILYI','<HTML>')
  947. WriteLn('FAMILYI','<TITLE>'FULLNAME' Family Information</TITLE>')
  948. WriteCh('FAMILYI','<H2>Family of 'MFULLNAME' and 'MSPOUSEFULLNAME)
  949. WriteCh('FAMILYI',' <A HREF="GenealogyFile.html">')
  950. WriteLn('FAMILYI','<B>List of Persons.</B></A></H2><PRE><TT>')
  951.                     DO While ~EOF('FNDBNAME')
  952.                         line = ReadLn('FNDBNAME')
  953.                         WriteLn('FAMILYI',CheckForReplacement(line))
  954. IF DoGenText THEN WriteLn('GenealogyText',spcs'  'CheckForNAReplacement(line))
  955.                     END
  956.                     Close('FNDBNAME')
  957.                     WriteLn('FAMILYI','</HTML>')
  958.                     Close('FAMILYI')
  959.                     END
  960. /**/
  961.                 IF MARRIAGECELEBRANT ~= '' | Minfo THEN DO
  962.                     WriteCh('PERSONFILE',spcs)
  963.                     IF Minfo THEN
  964. WriteCh('PERSONFILE','(<A HREF="Family'mFGRN'I.html"><B>family info</B></A>) ')
  965.                     IF MARRIAGECELEBRANT ~= '' THEN DO
  966. WriteCh('PERSONFILE',FAMLABEL1': 'MARRIAGECELEBRANT)
  967. IF DoGenText THEN WriteLn('GenealogyText',spcs||FAMLABEL1': 'MARRIAGEnCELEBRANT)
  968.                         END
  969.                     WriteLn('PERSONFILE','')
  970.                     END
  971.                 IF MARRIAGECOMMENT ~= '' THEN DO
  972. WriteLn('PERSONFILE',spcs'  'FAMLABEL2': 'MARRIAGECOMMENT)
  973. IF DoGenText THEN WriteLn('GenealogyText',spcs'  'FAMLABEL2': 'MARRIAGEnCOMMENT)
  974.                     END
  975. /*********************************************************************************/
  976.  
  977.     DO k = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */
  978.         'GETCHILD' mFGRN k
  979.         mFGRNc = RESULT
  980.         'GETFIRSTNAME' mFGRNc
  981.         mFGRNcFIRSTNAME = RESULT
  982. /**/
  983.         IF mFGRNcFIRSTNAME ~= "" THEN DO
  984.             HasCHILDREN = 1
  985.             'GETLASTNAME' mFGRNc
  986.             mFGRNcLASTNAME = GetLastName(RESULT)
  987.             'GETFIRSTNAME' mFGRNc
  988.             mFGRNcFIRSTNAME = RESULT
  989.             'GETSEX' mFGRNc
  990. mFGRNcGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  991.             thelastname = mFGRNcLASTNAME
  992.             thegender = mFGRNcGENDER
  993. mFGRNcFULLNAME = GetFullName(mFGRNcFIRSTNAME)
  994. MmFGRNcFULLNAME = MGetFullName(mFGRNcFIRSTNAME)
  995. PmFGRNcFULLNAME = PGetFullName(mFGRNcFIRSTNAME)
  996.             'GETBIRTHDATE' mFGRNc
  997.             mFGRNcBIRTHDATE = RESULT
  998.             'GETDEATHDATE' mFGRNc
  999.             mFGRNcDEATHDATE = RESULT
  1000. /**/
  1001.             IF mFGRNcBIRTHDATE = "" THEN
  1002. mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,6) mFGRNc)
  1003.             ELSE
  1004. mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,4) mFGRNcBIRTHDATE)
  1005.  
  1006.             jk = MARRIAGES - i
  1007. WriteCh('PERSONFILE',vert.jk'      |_____ <A HREF="'mFGRNcFILENAME'.html">')
  1008. /**/
  1009.             IF mFGRNcLASTNAME ~= LASTNAME THEN
  1010. WriteCh('PERSONFILE',MmFGRNcFULLNAME)
  1011.             ELSE DO
  1012. IF mFGRNcGENDER = "m" THEN WriteCh('PERSONFILE','<B>'mFGRNcFIRSTNAME'</B>')
  1013. IF mFGRNcGENDER = "f" THEN WriteCh('PERSONFILE','<I>'mFGRNcFIRSTNAME'</I>')
  1014.                 END
  1015. WriteCh('PERSONFILE','</A> ')
  1016. /**/
  1017.             IF mFGRNcBIRTHDATE ~= "" THEN
  1018. WriteCh('PERSONFILE','   * 'mFGRNcBIRTHDATE)
  1019. /**/
  1020.             IF mFGRNcDEATHDATE ~= "" THEN
  1021. WriteCh('PERSONFILE','   + 'mFGRNcDEATHDATE)
  1022.  
  1023. Writeln('PERSONFILE','')
  1024. IF DoGenText THEN DO
  1025.     WriteCh('GenealogyText',vert.jk'      |_____ 'PmFGRNcFULLNAME)
  1026.     IF mFGRNcBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'mFGRNcBIRTHDATE)
  1027.     IF mFGRNcDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'mFGRNcDEATHDATE)
  1028.     WriteLn('GenealogyText','')
  1029.     END
  1030.             END
  1031.         END
  1032.     END
  1033. /*********************************************************************************/
  1034.                 END
  1035.         END
  1036.     ELSE DO
  1037.         WriteLn('PERSONFILE','  |')
  1038.         IF DoGenText THEN WriteLn('GenealogyText','  |')
  1039.         WriteLn('PERSONFILE','  'MFULLNAME)
  1040.         IF DoGenText THEN WriteLn('GenealogyText','  'PFULLNAME)
  1041.     END
  1042.     WriteLn('PERSONFILE','</TT></PRE>')
  1043.     IF HasPARENTS THEN DO
  1044.         WriteLn('PERSONFILE','<HR>')
  1045.         IF DoGenText THEN DO
  1046.             WriteLn('GenealogyText','')
  1047.             WriteLn('GenealogyText','-----------------------------------------------------------')
  1048.             WriteLn('GenealogyText','')
  1049.             END
  1050.         WriteCh('PERSONFILE','<H3>Ancestors of ')
  1051.         WriteCh('PERSONFILE','<B>'MFULLNAME)
  1052.         WriteLn('PERSONFILE','</H3>')
  1053.         IF DoGenText THEN WriteLn('GenealogyText',' Ancestors of 'PFULLNAME)
  1054.         IF DoGenText THEN WriteLn('GenealogyText','')
  1055.         WriteLn('PERSONFILE','<PRE><TT>')
  1056.         Paternal(ScionIRN,'  ')
  1057.         WriteCh('PERSONFILE','<H2>'MFULLNAME)
  1058.         IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHDATE)
  1059.         IF DEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'DEATHDATE)
  1060.         WriteLn('PERSONFILE','</H2>')
  1061.         IF DoGenText THEN DO
  1062.             WriteCh('GenealogyText',PFULLNAME)
  1063.             IF BIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'BIRTHDATE)
  1064.             IF DEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'DEATHDATE)
  1065.             WriteLn('GenealogyText','')
  1066.             END
  1067.         Maternal(ScionIRN,'  ')
  1068.         WriteLn('PERSONFILE','</TT></PRE>')
  1069.         END
  1070. /*    ELSE */
  1071. IF HasCHILDREN THEN DO
  1072.         WriteLn('PERSONFILE','<HR>')
  1073.         IF DoGenText THEN DO
  1074.             WriteLn('GenealogyText','')
  1075.             WriteLn('GenealogyText','-----------------------------------------------------------')
  1076.             WriteLn('GenealogyText','')
  1077.             WriteLn('GenealogyText',' Descendants of 'PFULLNAME)
  1078.             WriteLn('GenealogyText','')
  1079.             END
  1080.         WriteLn('PERSONFILE','<H3>Descendants of 'MFULLNAME'</H3>')
  1081.         indent = "  "
  1082.         WriteLn('PERSONFILE','<PRE><TT>')
  1083.         WriteCh('PERSONFILE',indent||MFULLNAME)
  1084.         IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHDATE)
  1085.         IF DEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'DEATHDATE)
  1086.         WriteLn('PERSONFILE','<BR>')
  1087.         IF DoGenText THEN DO
  1088.             WriteCh('GenealogyText',indent || PFULLNAME)
  1089.             IF BIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'BIRTHDATE)
  1090.             IF DEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'DEATHDATE)
  1091.             WriteLn('GenealogyText','')
  1092.             END
  1093.         marriagesANDchildren(ScionIRN,indent)
  1094.         WriteLn('PERSONFILE','</TT></PRE>')
  1095.         END
  1096. /*    WriteLn('PERSONFILE','<HR>')
  1097.     WriteLn('PERSONFILE','<Address>')
  1098.     'GETPROGVERSION'
  1099.     VERSION = RESULT
  1100.     WriteCh('PERSONFILE','<H3>ScionGenealogist')
  1101.     IF VERSION > 0 THEN WriteCh('PERSONFILE',' V 'VERSION)
  1102.     WriteLn('PERSONFILE',' © Robbie J Akins; ')
  1103.     WriteLn('PERSONFILE','ScionToMosaic.rexx © Harold H. Ipolyi</H3>')
  1104.     WriteLn('PERSONFILE','</Address>')                    */
  1105.     WriteLn('PERSONFILE','</HTML>')
  1106.     Close('PERSONFILE')
  1107.     IF EndOfFile & DoGenText THEN WriteLn('GenealogyText',' ')
  1108.  
  1109.     IF target = "NORMAL" & LASTNAME ~= "" THEN DO
  1110.         WriteCh('GenealogyFile','<A HREF="'PERSONFILENAME'.html">')
  1111.         WriteCh('GenealogyFile',MFULLNAME)
  1112.         WriteCh('GenealogyFile','</A>')
  1113.         IF BIRTHDATE ~= "" THEN WriteCh('GenealogyFile','  *'BIRTHDATE)
  1114.         IF DEATHDATE ~= "" THEN WriteCh('GenealogyFile',' +'DEATHDATE)
  1115. /*********************************************************************************/
  1116. IF HasFATHER THEN DO
  1117.     WriteCh('GenealogyFile',' (()) ')
  1118.     IF HasFileFATHER THEN WriteCh('GenealogyFile','<A HREF="'FATHERFILENAME'.html">')
  1119.     WriteCh('GenealogyFile',' 'MFATHERFULLNAME)
  1120.     IF HasFileFATHER THEN WriteCh('GenealogyFile','</A>')
  1121.     IF HasMOTHER THEN DO
  1122.         IF HasFATHER THEN WriteCh('GenealogyFile',' //\ ')
  1123.         IF HasFileMOTHER THEN WriteCh('GenealogyFile','<A HREF="'MOTHERFILENAME'.html">')
  1124.         WriteCh('GenealogyFile',MMOTHERFULLNAME)
  1125.         IF HasFileMOTHER THEN WriteCh('GenealogyFile','</A>')
  1126.         END
  1127.     END
  1128. /*********************************************************************************/
  1129.     WriteLn('GenealogyFile','<BR>')    /* do not close, we have many more to go. */
  1130. END
  1131.  
  1132.     RETURN
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138. IsNumeric: PROCEDURE
  1139.     PARSE ARG str
  1140.     RETURN DataType(str, 'W')
  1141.  
  1142.  
  1143.     /* create a file name short but unique */
  1144.  
  1145. FilName: PROCEDURE
  1146.     PARSE ARG finm lanm bdate
  1147.     RETURN Space(substr(finm,1,2) substr(lanm,1,4) bdate)
  1148.  
  1149. /******************************** Makedir **********************************/
  1150.  
  1151. /* Makedir - If a directory under the given name already exists, or can be
  1152.    created, return 1, otherwise return 0. Though this function works
  1153.    correctly under Workbench 1.3, it has the same effect as the existing
  1154.    MAKEDIR; hence it is useful only under 2.0.
  1155. */
  1156. Makedir: procedure
  1157.    ds = statef(arg(1))
  1158.  
  1159.    if ds='' then
  1160.       result = 'MAKEDIR'(arg(1))
  1161.    else
  1162.       result = left(ds,3) = 'DIR'
  1163.  
  1164.    return result
  1165.  
  1166. CheckForReplacement: PROCEDURE
  1167.     PARSE ARG line "<" last
  1168.     IF last = "" THEN RETURN CheckReplacement(line)
  1169.     RIRN = GetRIRN(last || ".")
  1170.     IF RIRN = 0 THEN RETURN line || "<" || last
  1171.     last = CheckForReplacement(last)        /* recursion */
  1172.     lastend = GetEnd(last || ".")
  1173.     'GETLASTNAME' RIRN
  1174.     RIRNLASTNAME = GetLastName(RESULT)
  1175.     'GETFIRSTNAME' RIRN
  1176.     RIRNFIRSTNAME = RESULT
  1177.     thelastname = RIRNLASTNAME
  1178.     'GETBIRTHDATE' RIRN
  1179.     RIRNBIRTHDATE = RESULT
  1180.     'GETSEX' RIRN
  1181.     IF translate(RESULT,xrange('a','z'),xrange('A','Z')) = "m" THEN
  1182.         RIRNFULLNAME = '<B>' || GetFullName(RIRNFIRSTNAME) || '</B>'
  1183.     ELSE
  1184.         RIRNFULLNAME = '<I>' || GetFullName(RIRNFIRSTNAME) || '</I>'
  1185.     IF RIRNLASTNAME = "" THEN
  1186.         RETURN line || RIRNFULLNAME || lastend
  1187.     IF RIRNBIRTHDATE = "" THEN
  1188. RIRNFILENAME = Space(substr(RIRNFIRSTNAME,1,2) substr(RIRNLASTNAME,1,6) RIRN)
  1189.     ELSE
  1190. RIRNFILENAME = Space(substr(RIRNFIRSTNAME,1,2) substr(RIRNLASTNAME,1,4) RIRNBIRTHDATE)
  1191.     RETURN line || '<A HREF="'RIRNFILENAME'.html">'RIRNFULLNAME'</A>' || lastend
  1192.  
  1193. CheckReplacement: PROCEDURE
  1194.     PARSE ARG line "[" last
  1195.     IF last = "" THEN RETURN line
  1196.     RIRN = GetaRIRN(last || ".")
  1197.     IF RIRN = 0 THEN RETURN line || "[" || last
  1198.     last = CheckForReplacement(last)        /* recursion */
  1199.     lastend = GetaEnd(last || ".")
  1200.     'GETLASTNAME' RIRN
  1201.     RIRNLASTNAME = GetLastName(RESULT)
  1202.     'GETFIRSTNAME' RIRN
  1203.     RIRNFIRSTNAME = RESULT
  1204.     thelastname = RIRNLASTNAME
  1205.     'GETBIRTHDATE' RIRN
  1206.     RIRNBIRTHDATE = RESULT
  1207.     'GETSEX' RIRN
  1208.     IF translate(RESULT,xrange('a','z'),xrange('A','Z')) = "m" THEN
  1209.         RIRNFULLNAME = '<B>' || GetFullName(RIRNFIRSTNAME) || '</B>'
  1210.     ELSE
  1211.         RIRNFULLNAME = '<I>' || GetFullName(RIRNFIRSTNAME) || '</I>'
  1212.     IF RIRNLASTNAME = "" THEN
  1213.         RETURN line || RIRNFULLNAME || lastend
  1214.     IF RIRNBIRTHDATE = "" THEN
  1215. RIRNFILENAME = Space(substr(RIRNFIRSTNAME,1,2) substr(RIRNLASTNAME,1,6) RIRN)
  1216.     ELSE
  1217. RIRNFILENAME = Space(substr(RIRNFIRSTNAME,1,2) substr(RIRNLASTNAME,1,4) RIRNBIRTHDATE)
  1218.     RETURN line || '<A HREF="'RIRNFILENAME'.html">'RIRNFULLNAME'</A>' || lastend
  1219.  
  1220. CheckForNAReplacement: PROCEDURE
  1221.     PARSE ARG line "<" last
  1222.     IF last = "" THEN RETURN CheckNAReplacement(line)
  1223.     RIRN = GetRIRN(last || ".")
  1224.     IF RIRN = 0 THEN RETURN line || "<" || last
  1225.     last = CheckForNAReplacement(last)        /* recursion */
  1226.     lastend = GetEnd(last || ".")
  1227.     'GETLASTNAME' RIRN
  1228.     RIRNLASTNAME = GetLastName(RESULT)
  1229.     'GETFIRSTNAME' RIRN
  1230.     RIRNFIRSTNAME = RESULT
  1231.     thelastname = RIRNLASTNAME
  1232.     'GETBIRTHDATE' RIRN
  1233.     RIRNBIRTHDATE = RESULT
  1234.     'GETSEX' RIRN
  1235.     GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1236. /*    thelastname = GetFullName(RIRNLASTNAME)                */
  1237.     thegender = GENDER
  1238.     IF thegender = "m" THEN
  1239.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1240.     ELSE
  1241.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1242.     RETURN line || RIRNFULLNAME lastend
  1243.  
  1244. CheckNAReplacement: PROCEDURE
  1245.     PARSE ARG line "[" last
  1246.     IF last = "" THEN RETURN line
  1247.     RIRN = GetaRIRN(last || ".")
  1248.     IF RIRN = 0 THEN RETURN line || "[" || last
  1249.     last = CheckForNAReplacement(last)        /* recursion */
  1250.     lastend = GetaEnd(last || ".")
  1251.     'GETLASTNAME' RIRN
  1252.     RIRNLASTNAME = GetLastName(RESULT)
  1253.     'GETFIRSTNAME' RIRN
  1254.     RIRNFIRSTNAME = RESULT
  1255.     thelastname = RIRNLASTNAME
  1256.     'GETBIRTHDATE' RIRN
  1257.     RIRNBIRTHDATE = RESULT
  1258.     'GETSEX' RIRN
  1259.     GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1260. /*    thelastname = GetFullName(RIRNLASTNAME)                */
  1261.     thegender = GENDER
  1262.     IF thegender = "m" THEN
  1263.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1264.     ELSE
  1265.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1266.     RETURN line || RIRNFULLNAME lastend
  1267.  
  1268. Paternal: PROCEDURE EXPOSE DoGenText
  1269.     PARSE ARG irn, indent
  1270.     'GETPARENTS' irn
  1271.     PARENTS = RESULT
  1272.     'GETPRINCIPAL' PARENTS
  1273.     PRINCIPAL = RESULT
  1274.     'GETSPOUSE' PARENTS
  1275.     SPOUSE = RESULT
  1276.     'GETSEX' PRINCIPAL
  1277.     IF RESULT = 'M' THEN DO
  1278.         FIRN = PRINCIPAL
  1279.         MIRN = SPOUSE
  1280.         END
  1281.     ELSE DO
  1282.         FIRN = SPOUSE
  1283.         MIRN = PRINCIPAL
  1284.         END
  1285.     pirn = FIRN
  1286.     IF 't'pirn't' ~= 'tt' THEN DO
  1287.         Paternal(pirn,'     'indent)
  1288.         'GETLASTNAME' pirn
  1289.         pirnLASTNAME = GetLastName(RESULT)
  1290.         thelastname = pirnLASTNAME
  1291.         'GETFIRSTNAME' pirn
  1292.         pirnFIRSTNAME = RESULT
  1293.         pirnFULLNAME = GetFullName(pirnFIRSTNAME)
  1294.         'GETBIRTHDATE' pirn
  1295.         pirnBIRTHDATE = RESULT
  1296.         IF pirnLASTNAME ~= "" THEN DO
  1297.             IF pirnBIRTHDATE = "" THEN
  1298. pirnPERSONFILENAME = Space(substr(pirnFIRSTNAME,1,2) substr(pirnLASTNAME,1,6) pirn)
  1299.             ELSE
  1300. pirnPERSONFILENAME = Space(substr(pirnFIRSTNAME,1,2) substr(pirnLASTNAME,1,4) pirnBIRTHDATE)
  1301.             END
  1302.         WriteCh('PERSONFILE',indent'- ')
  1303.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','<A HREF="'pirnPERSONFILENAME'.html">')
  1304.         WriteCh('PERSONFILE','<B>'pirnFULLNAME)
  1305.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  1306.         IF pirnBIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'pirnBIRTHDATE)
  1307.         'GETDEATHDATE' pirn
  1308.         pirnDEATHDATE = RESULT
  1309.         IF pirnDEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'pirnDEATHDATE)
  1310.         WriteLn('PERSONFILE','</B>')
  1311.         IF DoGenText THEN DO
  1312.             WriteCh('GenealogyText',indent'- 'pirnFULLNAME)
  1313.             IF pirnBIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'pirnBIRTHDATE)
  1314.             IF pirnDEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'pirnDEATHDATE)
  1315.             WriteLn('GenealogyText','')
  1316.             END
  1317.         Maternal(pirn,'     'indent)
  1318.         END
  1319.     RETURN 0
  1320.  
  1321. Maternal: PROCEDURE EXPOSE DoGenText
  1322.     PARSE ARG irn, indent
  1323.     'GETPARENTS' irn
  1324.     PARENTS = RESULT
  1325.     'GETPRINCIPAL' PARENTS
  1326.     PRINCIPAL = RESULT
  1327.     'GETSPOUSE' PARENTS
  1328.     SPOUSE = RESULT
  1329.     'GETSEX' PRINCIPAL
  1330.     IF RESULT = 'M' THEN DO
  1331.         FIRN = PRINCIPAL
  1332.         MIRN = SPOUSE
  1333.         END
  1334.     ELSE DO
  1335.         FIRN = SPOUSE
  1336.         MIRN = PRINCIPAL
  1337.         END
  1338.     pirn = MIRN
  1339.     IF 't'pirn't' ~= 'tt' THEN DO
  1340.         Paternal(pirn,'     'indent)
  1341.         'GETLASTNAME' pirn
  1342.         pirnLASTNAME = GetLastName(RESULT)
  1343.         thelastname = pirnLASTNAME
  1344.         'GETFIRSTNAME' pirn
  1345.         pirnFIRSTNAME = RESULT
  1346.         pirnFULLNAME = GetFullName(pirnFIRSTNAME)
  1347.         'GETBIRTHDATE' pirn
  1348.         pirnBIRTHDATE = RESULT
  1349.         IF pirnLASTNAME ~= "" THEN DO
  1350.             IF pirnBIRTHDATE = "" THEN
  1351. pirnPERSONFILENAME = Space(substr(pirnFIRSTNAME,1,2) substr(pirnLASTNAME,1,6) pirn)
  1352.             ELSE
  1353. pirnPERSONFILENAME = Space(substr(pirnFIRSTNAME,1,2) substr(pirnLASTNAME,1,4) pirnBIRTHDATE)
  1354.             END
  1355.         WriteCh('PERSONFILE',indent'- ')
  1356.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','<A HREF="'pirnPERSONFILENAME'.html">')
  1357.         WriteCh('PERSONFILE','<I>'pirnFULLNAME)
  1358.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  1359.         IF pirnBIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'pirnBIRTHDATE)
  1360.         'GETDEATHDATE' pirn
  1361.         pirnDEATHDATE = RESULT
  1362.         IF pirnDEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'pirnDEATHDATE)
  1363.         WriteLn('PERSONFILE','</I>')
  1364.         IF DoGenText THEN DO
  1365.             WriteCh('GenealogyText',indent'- 'pirnFULLNAME)
  1366.             IF pirnBIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'pirnBIRTHDATE)
  1367.             IF pirnDEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'pirnDEATHDATE)
  1368.             WriteLn('GenealogyText','')
  1369.             END
  1370.         Maternal(pirn,'     'indent)
  1371.         END
  1372.     RETURN 0
  1373.  
  1374. marriagesANDchildren: PROCEDURE EXPOSE DoGenText
  1375.         PARSE ARG ScionIRN,indent
  1376.     DO i = 0 TO 39            /*    ??? GETTOTMARRIAGES IRN ???    */
  1377.         'GETMARRIAGE' ScionIRN i
  1378.         MARRIAGE = RESULT
  1379.         IF MARRIAGE > -1 THEN DO
  1380.             MARRIAGES = i
  1381.             END
  1382.     END
  1383.     tMARRIAGESt = 't'MARRIAGES't'
  1384. /*      Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt */
  1385.  
  1386.     IF tMARRIAGESt ~= 'tMARRIAGESt' THEN DO
  1387.         DO i = 0 TO MARRIAGES
  1388.             'GETMARRIAGE' ScionIRN i
  1389.             mFGRN = RESULT
  1390.             IF mFGRN ~= "" THEN DO
  1391.                 'GETSPOUSE' mFGRN
  1392.                 SPOUSE = RESULT
  1393.                 IF SPOUSE = ScionIRN THEN
  1394.                     DO
  1395.                     'GETPRINCIPAL' mFGRN
  1396.                     SPOUSE = RESULT
  1397.                     END
  1398.                 'GETLASTNAME' SPOUSE
  1399.                 SPOUSELASTNAME = GetLastName(RESULT)
  1400.                 'GETFIRSTNAME' SPOUSE
  1401.                 SPOUSEFIRSTNAME = RESULT
  1402.                 thelastname = SPOUSELASTNAME
  1403.                 'GETSEX' SPOUSE
  1404.                 thegender = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1405. SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  1406. MSPOUSEFULLNAME = MGetFullName(SPOUSEFIRSTNAME)
  1407. PSPOUSEFULLNAME = PGetFullName(SPOUSEFIRSTNAME)
  1408.                 'GETBIRTHDATE' SPOUSE
  1409.                 SPOUSEBIRTHDATE = RESULT
  1410.                 'GETDEATHDATE' SPOUSE
  1411.                 SPOUSEDEATHDATE = RESULT
  1412.                 IF SPOUSEBIRTHDATE = "" THEN
  1413. SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,6) SPOUSE)
  1414.                 ELSE
  1415. SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,4) SPOUSEBIRTHDATE)
  1416.                 WriteCH('PERSONFILE',indent'spouse: ')
  1417.                 IF SPOUSELASTNAME ~= "" THEN
  1418. WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.html">')
  1419. WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  1420.                 IF SPOUSELASTNAME ~= "" THEN
  1421. WriteCh('PERSONFILE','</A>')
  1422.                 IF SPOUSEBIRTHDATE ~= "" THEN
  1423. WriteCh('PERSONFILE','   * 'SPOUSEBIRTHDATE)
  1424.                 IF SPOUSEDEATHDATE ~= "" THEN
  1425. WriteCh('PERSONFILE','   + 'SPOUSEDEATHDATE)
  1426.                 IF DoGenText THEN DO
  1427. WriteCh('GenealogyText',indent'spouse: 'PSPOUSEFULLNAME)
  1428.                     IF SPOUSEBIRTHDATE ~= "" THEN
  1429. WriteCh('GenealogyText','   * 'SPOUSEBIRTHDATE)
  1430.                     IF SPOUSEDEATHDATE ~= "" THEN
  1431. WriteCh('GenealogyText','   + 'SPOUSEDEATHDATE)
  1432. WriteLn('GenealogyText','')
  1433.                     END
  1434.                 WriteLn('PERSONFILE','<BR>')
  1435.     indent2 = indent || " | "
  1436.     DO k = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */            
  1437.         'GETCHILD' mFGRN k
  1438.         mFGRNc = RESULT
  1439.         'GETFIRSTNAME' mFGRNc
  1440.         mFGRNcFIRSTNAME = RESULT
  1441. /**/
  1442.         IF mFGRNcFIRSTNAME ~= "" THEN DO
  1443.             'GETLASTNAME' mFGRNc
  1444.             mFGRNcLASTNAME = GetLastName(RESULT)
  1445.             'GETFIRSTNAME' mFGRNc
  1446.             mFGRNcFIRSTNAME = RESULT
  1447.             'GETSEX' mFGRNc
  1448. mFGRNcGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1449.             thelastname = mFGRNcLASTNAME
  1450.             thegender = mFGRNcGENDER
  1451. mFGRNcFULLNAME = GetFullName(mFGRNcFIRSTNAME)
  1452. MmFGRNcFULLNAME = MGetFullName(mFGRNcFIRSTNAME)
  1453. PmFGRNcFULLNAME = PGetFullName(mFGRNcFIRSTNAME)
  1454.             'GETBIRTHDATE' mFGRNc
  1455.             mFGRNcBIRTHDATE = RESULT
  1456.             'GETDEATHDATE' mFGRNc
  1457.             mFGRNcDEATHDATE = RESULT
  1458. /**/
  1459.             IF mFGRNcBIRTHDATE = "" THEN
  1460. mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,6) mFGRNc)
  1461.             ELSE
  1462. mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,4) mFGRNcBIRTHDATE)
  1463. /**/
  1464. WriteCh('PERSONFILE',indent2||'<A HREF="'mFGRNcFILENAME'.html">'MmFGRNcFULLNAME'</A> ')
  1465. /**/
  1466.             IF mFGRNcBIRTHDATE ~= "" THEN
  1467. WriteCh('PERSONFILE','   * 'mFGRNcBIRTHDATE)
  1468. /**/
  1469.             IF mFGRNcDEATHDATE ~= "" THEN
  1470. WriteCh('PERSONFILE','   + 'mFGRNcDEATHDATE)
  1471.  
  1472. Writeln('PERSONFILE','<BR>')
  1473. IF DoGenText THEN DO
  1474.     WriteCh('GenealogyText',indent2||PmFGRNcFULLNAME)
  1475.     IF mFGRNcBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'mFGRNcBIRTHDATE)
  1476.     IF mFGRNcDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'mFGRNcDEATHDATE)
  1477.     WriteLn('GenealogyText','')
  1478.     END
  1479. /**********************/
  1480.             marriagesANDchildren(mFGRNc,indent2)
  1481.             END
  1482.     END
  1483.                 END
  1484.             END
  1485.         END
  1486.     RETURN 0
  1487.  
  1488. GetRIRN: PROCEDURE
  1489.     PARSE ARG numb ">" last
  1490.     IF last = "" THEN RETURN 0
  1491.     IF IsNumeric(numb) THEN RETURN numb
  1492.     RETURN 0
  1493.  
  1494. GetaRIRN: PROCEDURE
  1495.     PARSE ARG numb "]" last
  1496.     IF last = "" THEN RETURN 0
  1497.     IF IsNumeric(numb) THEN RETURN numb
  1498.     RETURN 0
  1499.  
  1500. GetEnd: PROCEDURE
  1501.     PARSE ARG line ">" last
  1502.     IF last = "" THEN RETURN substr(line,1,length(line)-1)
  1503.     RETURN substr(last,1,length(last)-1)
  1504.  
  1505. GetaEnd: PROCEDURE
  1506.     PARSE ARG line "]" last
  1507.     IF last = "" THEN RETURN substr(line,1,length(line)-1)
  1508.     RETURN substr(last,1,length(last)-1)
  1509.  
  1510. GetLength: PROCEDURE
  1511.     PARSE UPPER ARG names
  1512.     nonletters = length(compress(names, xrange('A','Z')))
  1513.     RETURN Length(names) - nonletters * 4 / 10
  1514.  
  1515.     /* create a full name from first, last, and honorifics parts */
  1516.  
  1517. GetFullName: PROCEDURE EXPOSE thelastname
  1518.     PARSE ARG firstnames "," hon
  1519.     IF hon = "" THEN DO
  1520.         IF length(firstnames) > 2 THEN
  1521.             IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1522.                 firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1523.         RETURN firstnames thelastname
  1524.         END
  1525.     RETURN firstnames Space(thelastname) || ","hon
  1526.     
  1527. MGetFullName: PROCEDURE EXPOSE thelastname thegender
  1528.     PARSE ARG firstnames "," hon
  1529.     gchar = "B"
  1530.     IF thegender = "f" THEN gchar = "I"
  1531.     IF hon = "" THEN DO
  1532.         IF length(firstnames) > 2 THEN
  1533.             IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1534.                 firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1535.         RETURN "<"gchar">"firstnames thelastname"</"gchar">"
  1536.         END
  1537.     RETURN "<"gchar">"firstnames Space(thelastname) || ","hon"</"gchar">"
  1538.     
  1539. PGetFullName: PROCEDURE EXPOSE thelastname thegender
  1540.     PARSE ARG firstnames "," hon
  1541.     schar = "1"
  1542.     uchar = "2"
  1543.     IF thegender = "f" THEN DO
  1544.         schar = "3"
  1545.         uchar = "3"
  1546.         END
  1547.     IF hon = "" THEN DO
  1548.         IF length(firstnames) > 2 THEN
  1549.             IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1550.                 firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1551.         RETURN ""schar"m"firstnames thelastname""uchar"m"
  1552.         END
  1553.     RETURN ""schar"m"firstnames Space(thelastname) || ","hon""uchar"m"
  1554.     
  1555.  
  1556.  
  1557.     /* Capitalize last name; also handle special cases! */
  1558.     /* End users must customize this code to aviod trashy output */
  1559.  
  1560. GetLastName: PROCEDURE
  1561.     PARSE ARG str
  1562.     IF str = "BAUER-GAUSS" THEN RETURN "Bauer-Gauss"
  1563.         IF str = "DE IPOLYI" THEN RETURN "deIpolyi"
  1564.         IF str = "DEIPOLYI" THEN RETURN "deIpolyi"
  1565.         IF str = "MC GRADY" THEN RETURN "McGrady"
  1566.         IF str = "KIS RED" THEN RETURN "KisRed"
  1567.         IF str = "ROTH-HACKENSCHMIDT" THEN RETURN "Roth-Hackenschmidt"
  1568.     IF str = "SCHüCH-GLICKHFELDEN" THEN RETURN "Schüch-Glickhfelden"
  1569.     ELSE
  1570.         DO
  1571.         spart = translate(substr(str,2,length(str)),xrange('a','z'),xrange('A','Z'))
  1572.         END
  1573.     RETURN substr(str,1,1)Space(spart)
  1574.